# 召唤数学精灵
"""
数学家们发现了两种用于召唤强大的数学精灵的仪式，这两种仪式分别被称为累加法仪式 A(n) 和累乘法仪式 B(n)。
累加法仪式 A(n) 是将从 1 到 n 的所有数字进行累加求和，即：
    A(n)=1+2+⋯+n
累乘法仪式 B(n) 则是将从 1 到 n 的所有数字进行累乘求积，即：
    B(n)=1×2×⋯×n
据说，当某个数字 A(i)−B(i) 能被 100 整除时，数学精灵就会被召唤出来。
现在，请你寻找在 1 到 2024041331404202 之间有多少个数字 i，能够成功召唤出强大的数学精灵。

解题思路：
想要使得(A(n) - B(n)) % 100 = 0 也就是 A(n) % 100 = B(n) % 100
对于 B(n) 来说, 当 n>=10 时, B(n) % 100 = 0, 所以需要分以下两种情况考虑:
1. 当 i < 10 时:
    直接暴力求解
2. 当 i >= 10 时:
    要使 A(n) % 100 = 0, 也就是 (n + 1) * n / 2 % 100 = 0 等价于 (n + 1) * n % 200 = 0
    那我们只需要计算在[1, 200] 这个区间内有多少个 符合条件的元素即可


"""


def main():
    # 当 n 小于 10 时
    res1 = 0
    a = 1  # 表示阶乘
    for i in range(1, 10):
        a *= i
        if (((i + 1) * i) / 2 - a) % 100 == 0:
            res1 += 1
    print(res1)

    # 当 n 大于 10 时
    res2 = 0
    a = 1  # 阶乘
    b = 0  # 累加
    for i in range(10, 201):
        a *= i
        b += i
        if (a - b) % 100 == 0:
            res2 += 1
    # 每200个元素有4个符合条件
    print(res2)

    res = (2024041331404202 // 200) * 4 + res1
    print(res)


if __name__ == '__main__':
    main()
